package com.ruoyi.generator.domain;

import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.UUIDGenerator;
import com.ruoyi.common.utils.StringUtils;
import jakarta.annotation.Nullable;
import jakarta.validation.constraints.NotBlank;
import org.babyfish.jimmer.Formula;
import org.babyfish.jimmer.sql.*;

import java.util.Objects;

/**
 * 代码生成业务字段表 gen_table_column
 *
 * @author ruoyi
 */
@Entity
@Table(name = "gen_table_column")
public interface GenTableColumn extends BaseEntity {

    /**
     * 编号
     */
    @Id
    @GeneratedValue(generatorType = UUIDGenerator.class)
    String columnId();

    /**
     * 归属表编号
     */
    @IdView
    @Nullable
    String tableId();

    /**
     * 列名称
     */
    @Nullable
    String columnName();

    /**
     * 列描述
     */
    @Nullable
    String columnComment();

    /**
     * 列类型
     */
    @Nullable
    String columnType();

    /**
     * JAVA类型
     */
    @Nullable
    String javaType();

    /**
     * JAVA字段名
     */
    @NotBlank(message = "Java属性不能为空")
    @Nullable
    String javaField();

    /**
     * 是否主键（1是）
     */
    @Nullable
    Boolean isPk();

    /**
     * 是否自增（1是）
     */
    @Nullable
    Boolean isIncrement();

    /**
     * 是否必填（1是）
     */
    @Nullable
    Boolean isRequired();

    /**
     * 是否为插入字段（1是）
     */
    @Nullable
    Boolean isInsert();

    /**
     * 是否编辑字段（1是）
     */
    @Nullable
    Boolean isEdit();

    /**
     * 是否列表字段（1是）
     */
    @Nullable
    Boolean isList();

    /**
     * 是否查询字段（1是）
     */
    @Nullable
    Boolean isQuery();

    /**
     * 查询方式（EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围）
     */
    @Nullable
    String queryType();

    /**
     * 显示类型（input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件）
     */
    @Nullable
    String htmlType();

    /**
     * 字典类型
     */
    @Nullable
    String dictType();

    /**
     * 排序
     */
    @Nullable
    Integer sort();

    @ManyToOne
    @Nullable
    @OnDissociate(DissociateAction.DELETE)
    GenTable table();

    @Formula(dependencies = "javaField")
    default boolean isSuperColumn() {
        return StringUtils.equalsAnyIgnoreCase(this.javaField(),
                "createBy", "createTime", "updateBy", "updateTime", "remark");
    }

    @Formula(dependencies = "javaField")
    default boolean isUsableColumn() {
        // isSuperColumn()中的名单用于避免生成多余Domain属性，若某些属性在生成页面时需要用到不能忽略，则放在此处白名单
        return StringUtils.equalsAnyIgnoreCase(javaField(), "parentId", "orderNum", "remark");
    }

    @Formula(dependencies = "javaField")
    default String capJavaField() {
        return StringUtils.capitalize(javaField());
    }

    @Formula(dependencies = "columnComment")
    default String readConverterExp() {
        String remarks = StringUtils.substringBetween(this.columnComment(), "（", "）");
        StringBuilder sb = new StringBuilder();
        if (StringUtils.isNotEmpty(remarks)) {
            for (String value : Objects.requireNonNull(remarks).split(" ")) {
                if (StringUtils.isNotEmpty(value)) {
                    Object startStr = value.subSequence(0, 1);
                    String endStr = value.substring(1);
                    sb.append(startStr).append("=").append(endStr).append(",");
                }
            }
            return sb.deleteCharAt(sb.length() - 1).toString();
        } else {
            return this.columnComment();
        }
    }
}
